package com.client.forms;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.client.controller.EntryController;
import com.google.gwt.user.client.ui.VerticalPanel;

/**
 * Classe abstraire pour l'édition de Donnees
 * @author queyroi
 *
 * @param <T> la classe {@link IData} editée
 */
public abstract class DataEditor<T> extends VerticalPanel{
	/**
	 * Donnes éditée
	 */
	protected T edited;
	/**
	 * Controlleur pour les informations saisies
	 */
	protected List<EntryController> listController = new ArrayList<EntryController>();
	
	public DataEditor() {	}

	/**
	 * @param edited the edited to set
	 */
	public void setEdited(T edited) {
		this.edited = edited;
	}

	/**
	 * @return the edited
	 */
	public T getEdited() {
		return edited;
	}
	/**
	 * Rempli l'éditeur avec l'objet en attribut
	 */
	public abstract void fill();
	/**
	 * Obtenir les information sur forme de Map
	 * @return Map nom des variables, contenus
	 * @throws IllegalArgumentException
	 */
	public abstract Map<String,String> getEditedAsMap() throws IllegalArgumentException;
	/**
	 * Lancement des vérifications par les {@link EntryController}
	 * @throws IllegalArgumentException
	 */
	public void check() throws IllegalArgumentException{
		boolean checked = true;
		String errorMsg = "";	
		
		for(EntryController controller : listController){
			if(!controller.check()){
				checked = false;
				errorMsg = errorMsg+controller.getSource()+"\n";
			}
		}
	
		if(!checked){
			throw new IllegalArgumentException("Erreur :\n"+errorMsg);
		}
	}
	/** 
	 * @return liste des {@link EntryController}
	 */
	public List<EntryController> getListController() {
		return listController;
	}
	/**
	 * Vide l'editeur
	 */
	public abstract void setEmpty();

}
